import pandas as pd
import numpy as np
from test_bick import  Data_preprocessing
from sklearn.model_selection import train_test_split
import os

from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Ridge
from sklearn.linear_model import RidgeCV
from sklearn.linear_model import Lasso
from sklearn.linear_model import ElasticNet

from sklearn.metrics import r2_score#R square
from sklearn.metrics import mean_squared_error #均方误差
from sklearn.metrics import mean_absolute_error #平方绝对误差

import matplotlib.pyplot as plt


def load_data():#导入数据
    global x_data,y_data,name_data

    if not os.path.isfile("FE_day.csv"):#调用已经做好特征工程的文件，如果文件不存在，就调用函数生成该文件
        Data_preprocessing()
        
    data = pd.read_csv("FE_day.csv")

    data = data.drop(['instant','hum','windspeed'], axis = 1)#去掉编号、湿度、风速等不相关数据
##    print(data)
    
    y_data = data['cnt']
    x_data = data.drop('cnt', axis = 1)

    y_data=np.array(y_data)
    x_data=np.array(x_data)
    name_data =list(data.columns)#返回对象列索引

##    print(x_data)
##    print(y_data)
##    print(name_data)
def traintestsplit():#数据分割，一部分用于验证、一部分用于训练
    global x_data,y_data,name_data

    X_train,X_test,y_train,y_test=train_test_split(x_data,y_data,random_state=0,test_size=0.20)#分割数据，20%用于测试，80%用于训练

    return X_train,X_test,y_train,y_test

load_data() #数据导入
X_train,X_test,y_train,y_test=traintestsplit()  #数据分割

###使用线性回归模型LinearRegression对数据进行训练及预测
##
###lr=LinearRegression()#最小二乘线性回归模型
##
###lr=Ridge()#岭回归模型
##
###lr=RidgeCV()#
##
##lr=Lasso()#Lasso模型
##
###lr=ElasticNet()
##
###使用训练数据进行参数估计
##lr.fit(X_train,y_train) #训练模型
##
###R2评价指标
##lr_y_predict=lr.predict(X_test)
##score = r2_score(y_test, lr_y_predict)
##print("R2:{}".format(score))
##
###MSE评价指标
##mse_test=mean_squared_error(y_test,lr_y_predict)
##print("MSE:{}".format(mse_test))
##
###RMSE评价指标
##Rmse_test=mean_absolute_error(y_test,lr_y_predict)
##print("RMSE:{}".format(Rmse_test))




##num=list(range(len(y_test)))
##plt.scatter(num,y_test,c="r")
##plt.scatter(num,lr_y_predict,c="y")
##plt.show()

#分别使用线性回归，岭回归，Lasso回归进行数据预测
lrg=LinearRegression()
ridge=Ridge()
lasso=Lasso()
lrg.fit(X_train,y_train)
ridge.fit(X_train,y_train)
lasso.fit(X_train,y_train)

#数据视图，此处获取各个算法的训练数据的coef_:系数，coef_可以理解为系数

plt.figure(figsize=(12,9))


#线性回归 得到的coef
axes=plt.subplot(221)
axes.plot(lrg.coef_)
axes.set_title('lrg_coef')

#l岭回归 得到的coef
axes=plt.subplot(222)
axes.plot(ridge.coef_)
axes.set_title('ridge_coef')

#lasso回归 得到的coef
axes=plt.subplot(223)
axes.plot(lasso.coef_)
axes.set_title('lasso_coef')

plt.show()



